iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0
Security

你的程式真的安全嗎?從資安的角度做 code review系列 第 24

J - reuse of initialization vector (不合標準的密碼術:重複利用初始化向量)

  • 分享至 

  • xImage
  •  

一次發三篇,希望我明天不要再偷懶了ˊˇˋ。

下方程式碼片段全部都是擷取自 Secure Code Warrior 線上安全程式培訓平台,因為練習互動時的題目多半不會只有單一個檔案,可能涉及多個檔案、資料夾及多處地方修改,因此我的文章主要是針對最主要的區塊做修改及說明,若有不好理解的地方非常抱歉也還請見諒,也可以實際上去 Secure Code Warrior 玩玩看,搭配著互動,會更有感的學習哦~

J - reuse of initialization vector(不合標準的密碼術:重複利用初始化向量)

  • 形成原因:如果在多個加密操作中重複使用相同的初始化向量,加密會變得不那麼隨機。
  • 後果:導致攻擊者可以透過觀察大量加密訊息,找出加密的邏輯進而推斷出原始資料。
  • 實例:在這個加密演算法中每個初始化向量都被硬編碼成0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,這導致攻擊者很容易透過字典檔攻擊解密由這個演算法加密的密文
public class SymmetricCipherTest {  
    public static void main() {
        byte[] text ="Secret".getBytes();  
        byte[] iv ={  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
        };
        KeyGenerator kg = KeyGenerator.getInstance("DES");  
        kg.init(56);
        SecretKey key = kg.generateKey();
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        IvParameterSpec ips = new IvParameterSpec(iv);  
        cipher.init(Cipher.ENCRYPT_MODE, key, ips);
        return cipher.doFinal(inpBytes);
    }
}
  • 解決方法:
    • 使用 Galois/Counter Mode (GCM) 模式
    • 為每個加密操作產生一個新的初始化向量
    • 總是產生隨機初始化向量

第1題

錯誤區塊

Base64.getEncoder().encodeToString(IV.getBytes());
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:
使用了 IV.getBytes() 將初始化向量IV轉換為字節陣列,然後再對它進行 Base64 編碼,IV 是一個固定值或硬編碼的字串,導致相同的IV在多次加密中重複使用,這使加密結果容易受到攻擊。

主要修正方法

Base64.getEncoder().encodeToString(se.getIv());
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:
se.getIv() 是通過加密庫的安全隨機數生成器生成的,這將提升加密的安全性,因為每次加密時都會生成一個新的隨機IV,從而避免了重複使用相同的IV

這題分類好像放錯但又不知道要放哪所以我放這邊

  • 他原本放 weak crypto algorithm(不合標準的密碼術:加密金鑰的產生方式不安全)

第2題

錯誤區塊

.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
.setEncryptionPaddings(KeyProperties.BLOCK_MODE_CTR)
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:
BLOCK_MODE_GCMBLOCK_MODE_CTR 是兩種不同的塊加密模式,但在同一個加密操作中,這兩者是不能同時使用的。

主要修正方法

.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:
因為 GCM 模式本身是一種不需要填充的模式。這樣可以避免因為不必要的填充而造成的潛在錯誤。


上一篇
J - weak crypto algorithm (不合標準的密碼術:使用不安全/已棄用的演算法)
下一篇
J - using hardcoded keys (不安全的身份驗證:使用硬編碼的金鑰)
系列文
你的程式真的安全嗎?從資安的角度做 code review25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言